package day32.stream;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Stream;

// Stream的中间操作
// 多项中间操作可以连接起来形成链式调用(链式操作)
// 在遇到终止操作之前, 调用链上的所有中间操作是不会执行的
// 当遇到终止操作时, 调用链上的所有中间操作一次性全部处理
// 这种情况称为 惰性操作
public class Demo02 {
	public static void main(String[] args) {
		test03();
	}

	// Stream中间操作之排序
	private static void test03() {
		// sorted(), 自然排序, 根据元素的自然顺序进行排序
		//		List<String> list = Arrays.asList("ddd", "bbb", "fff", "ccc", "aaa", "eee");
		//		list.stream().sorted().forEach(System.out::println);

		// sorted(Comparator com), 定制排序, 根据比较器制定的规则排序
		Comparator<Emp> com = (e1, e2) -> {
			if (Double.compare(e1.getSalary(), e2.getSalary()) == 0) {
				return Integer.compare(e1.getAge(), e2.getAge());
			}
			return Double.compare(e1.getSalary(), e2.getSalary());
		};

		Emp.getTestData().stream().sorted(com).forEach(System.out::println);
	}

	// Stream中间操作之映射
	private static void test02() {
		// map(Function f)
		// 将Function中定义的操作, 应用到每个元素上, 产生一个新的元素
		// 根据map方法操作之后, 会得到新的流对象
		//		List<String> list = Arrays.asList("aaa", "bbb", "ccc", "ddd", "eee", "fff");
		//		list.stream().map(s -> s.toUpperCase()).forEach(System.out::println);
		//		Stream<Emp> stream01 = Emp.getTestData().stream();
		//		Stream<String> stream02 = stream01.map(Emp::getName);
		//		stream02.forEach(System.out::println);

		// flatMap(Function f)
		List<String> list = Arrays.asList("aaa", "bbb", "ccc", "ddd", "eee", "fff");
		Stream<String> stream = list.stream();
		//		Stream<Stream<Character>> stream2 = stream.map(s -> strHandler(s));
		//		stream2.forEach(s -> s.forEach(System.out::println));
		Stream<Character> stream2 = stream.flatMap(s -> strHandler(s));
		stream2.forEach(System.out::println);
	}

	// 将一个字符串转换成一个Character类型的Stream
	public static Stream<Character> strHandler(String str) {
		List<Character> list = new ArrayList<Character>();
		for (Character c : str.toCharArray()) {
			list.add(c);
		}
		return list.stream();
	}

	// Stream中间操作之筛选与切片
	private static void test01() {
		// filter(Predicate p)
		// 根据断言lambda表达式的结果进行数据筛选
		List<Emp> list = Emp.getTestData();
		// list.forEach(System.out::println);

		// 找出35岁以上的员工
		//		list.stream().filter(e -> {
		//			System.out.println("Demo02.test01()");
		//			return e.getAge() >= 35;
		//		}).forEach(System.out::println);

		// limit(long maxSize), 截取
		// list.stream().limit(5).forEach(System.out::println);

		// skip(long n)
		// 跳过流中n个元素
		// list.stream().skip(5).forEach(System.out::println);

		// distinct(), 去重
		// 根据元素的hashCode()与equals()
		list.stream().distinct().forEach(System.out::println);
	}
}
